package bsh.utils.reflection.transform;

import bsh.meta.TypeTransformation;
import bsh.meta.TypeWrapper;

/**
 * Define um construtor de {@link TypeTransformation} baseado nos parametros de entrada
 * 
 * @author takeshi
 */
public interface TypeTransformationFactory {

    /**
     * Verifica se este {@link TypeTransformationFactory} pode gerar {@link TypeTransformation} que parte do tipo passado para o tipo
     * resultante
     * 
     * @param fromType {@link TypeWrapper}
     * @param toType {@link TypeWrapper}
     * @return boolean
     */
    boolean isApplicable(TypeWrapper fromType, TypeWrapper toType);

    /**
     * Devolve o {@link TypeTransformation} aplicavel. Este metodo pode lancar uma excecao se nao for possivel criar um
     * {@link TypeTransformation}
     * 
     * @param fromType {@link TypeWrapper}
     * @param toType {@link TypeWrapper}
     * @return {@link TypeTransformation}
     */
    TypeTransformation getTypeTransformation(TypeWrapper fromType, TypeWrapper toType);

}
